package com.example.ipccore;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.example.ipccore.request.RequestBean;
import com.example.ipccore.request.RequestParameter;
import com.google.gson.Gson;

import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;

public class TuYaService extends Service {
    //服务端才有 BBBinder
    BBBinder bbBinder=new BBBinder();
    //服务发现
    public static final int TYPE_GET=1;
    //服务调用
    public static final int TYPE_INVOKE=2;
    Gson gson=new Gson();
    CacheCenter cacheCenter = CacheCenter.getInstance();

    @Override
    public IBinder onBind(Intent intent) {
        return new ITuyaBinderInterface.Stub() {
            @Override
            public String transact(String request) throws RemoteException {
                //反序列化数据，将JSON数据转为JavaBean
                RequestBean requestBean = gson.fromJson(request, RequestBean.class);
                //判断是服务发现还是服务调用
                switch (requestBean.getType()){
                    case TYPE_GET:
                        //服务发现,最终是构建服务对应的实例对象。
                        // 即：调用getInstance，将方法反射到method，并invoke执行。
                        //解析拿到入参。
                        Object[] parameters = makeParameterObject(requestBean);
                        //从方法表中拿到method(需要先进行服务注册，注册类表与方法表)。服务发现是查找 getInstance()获取实例
                        Method method = cacheCenter.getMethod(requestBean);
                        //调用Method，这里是getInstance，得到实例对象。
                        //第一个参数 (null) 表示调用的是一个静态方法。如果是实例方法，这里需要传入对象实例。
                        Object instance = bbBinder.onTransact(null,method, parameters);
                        //将初始化后的实例对象存起来，存到实例对象表中
                        cacheCenter.putObject(requestBean.getClassName(),instance);
                        break;
                    case TYPE_INVOKE:
                        //服务调用
                        Log.e("xunyou", "transact: 服务调用-> "+request);
                        //获取之前在服务发现时初始化的实例对象
                        Object object = cacheCenter.getObject(requestBean.getClassName());
                        //获取方法
                        Method method1 = cacheCenter.getMethod(requestBean);
                        //生成入参参数
                        Object[] objects = makeParameterObject(requestBean);
                        //通过BBBinder调用对应服务功能
                        Object result = bbBinder.onTransact(object,method1, objects);
                        String data = gson.toJson(result);
                        return data;
                }
                return "";
            }
        };
    }

    private Object[] makeParameterObject(RequestBean requestBean){
        //调用函数的参数
        Object[] mParameters = null;
        RequestParameter[] requestParameters = requestBean.getRequestParameters();
        if (requestParameters!=null && requestParameters.length>0){
            mParameters=new Object[requestParameters.length];
            for (int i = 0; i < requestParameters.length; i++) {
                RequestParameter requestParameter = requestParameters[i];
                Class<?> clazz = cacheCenter.getClassType(requestParameter.getParameterClassName());
                mParameters[i]=gson.fromJson(requestParameter.getParameterValue(),clazz);
            }
        }else {
            mParameters = new Object[0];
        }
        return mParameters;
    }
}